package model;

import java.io.ObjectStreamField;
import java.io.Serializable;

/**
 * @author liangd
 * date 2020-11-12 16:16
 * code 实例化字段
 */
public class UserModel implements Serializable {
    /*
     * 实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。
     * 如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。
     *
     * serialVersionUID作用：
     * 序列化时为了保持版本的兼容性，即在版本升级时反序列化仍保持对象的唯一性。
     *
     * 生成serialVersionUID的两种方式
     * 1、默认的1L
     * 2、根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
     */
    //默认
//    private static final long serialVersionUID = 1L;
    private static final long serialVersionUID = -8940196742313994740L;
    private int id;
    //被transient修饰的字段不会被实例化
//    private transient String username;
    private int age;
    private int sex;
    private String address;

    /**
     * 序列化字段的两种方式：
     * 1、默认方式，Java对象中的非静态和非transient的字段都会被定义为需要序列的字段。
     * 2、另外一种方式是通过 ObjectStreamField 数组来声明类需要序列化的对象。
     */
    private static final ObjectStreamField[] serialPersistentFields = {
            new ObjectStreamField("username", String.class),
            new ObjectStreamField("age", int.class)
    };
    /*
        Java 中进行序列化操作需要实现 Serializable 或 Externalizable 接口。
        序列化的目的有两个，第一个是便于存储，第二个是便于传输。
        一、序列化作用：
           1、 提供一种简单又可扩展的对象保存恢复机制。
           2、 对于远程调用，能方便对对象进行编码和解码，就像实现对象直接传输。
           3、 可以将对象持久化到介质中，就像实现对象直接存储。
           4、 允许对象自定义外部存储的格式。

        二、何时需要实现序列化
          在存储时需要序列化

        三、平常实体类没有实现Serializable接口，怎么也能存进数据库呢？
          是因为在声明变量的时候，例如String、int、Boolean等时，数据类型已经实现了序列化
     */
}
